/*  
Copyright Microsoft Corporation

Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at 

http://www.apache.org/licenses/LICENSE-2.0 

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED 
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
MERCHANTABLITY OR NON-INFRINGEMENT. 

See the Apache 2 License for the specific language governing permissions and
limitations under the License. */

using System;
using System.Collections.Generic;
using System.Linq;
using MileageStats.Domain.Contracts;
using MileageStats.Domain.Contracts.Data;
using MileageStats.Domain.Models;
using MileageStats.Domain.Properties;


namespace MileageStats.Domain.Handlers
{
    public class GetUnfulfilledRemindersForVehicle
    {
        private readonly IReminderRepository _reminderRepository;

        public GetUnfulfilledRemindersForVehicle(IReminderRepository reminderRepository)
        {
            _reminderRepository = reminderRepository;
        }

        public virtual IEnumerable<Reminder> Execute(int userId, int vehicleId, int odometer)
        {
            try
            {
                var reminders = _reminderRepository
                    .GetRemindersForVehicle(vehicleId)
                    .ToList();

                foreach (var reminder in reminders)
                {
                    reminder.CalculateIsOverdue(odometer);
                }

                var unfulfilledReminders = reminders
                    .Where(f => f.IsFulfilled == false)
                    .OrderBy(f => f.DueDistance)
                    .ThenBy(f => f.DueDate)
                    .ToList();

                return unfulfilledReminders.ToList();

            }
            catch (InvalidOperationException ex)
            {
                throw new UnauthorizedException(Resources.UnableToRetrieveUnfulfilledReminders, ex);
            }
        }
    }
}